package dao;
     /**
     * Responsavel por realizar transações com o BD
     *
     */
import classes.Categoria;
import conexao.GerenciadorConexao;
import erro.ConexaoException;
import erro.ConsultaException;
import erro.DaoException;
import erro.GeralException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class DaoCategoria implements IDaoCategoria{
    private GerenciadorConexao g;

    public DaoCategoria() {
        g = GerenciadorConexao.getInstancia();
    }
    /**
     * Insere um novo registro no BD
     * @param cat
     * @throws GeralException
     * @throws ConexaoException
     * @throws ConsultaException
     * @throws  SQLException
     */
    @Override
    public void inserir(Categoria cat) throws ConexaoException, DaoException{
        String sql = "INSERT INTO Categoria (nomecategoria) VALUES (?)";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setString(1, cat.getNomeCategoria());
            
            pstm.executeUpdate();

        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
    }
    /**
     * Altera um registro no BD
     * @param cat
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    @Override
    public void alterar(Categoria cat) throws ConexaoException, DaoException {
        String sql = "UPDATE Categoria SET nomecategoria=? WHERE codcategoria=?";
        try {
            PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);

            pstm.setString(1, cat.getNomeCategoria());
            
            pstm.setInt(2, cat.getCodCategoria());
            pstm.executeUpdate();
        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
    }
    /**
     * Exclui um registro no BD
     * @param cat
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    @Override
    public void deletar(Categoria cat) throws ConexaoException, DaoException {

        String sql = "DELETE FROM Categoria where codcategoria=?";
        try {
            PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);
            pstm.setInt(1, cat.getCodCategoria());
            pstm.executeUpdate();

        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
    }
    
        /**
     * Faz uma pesquisa no BD
     * @param cat
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    @Override
     public Categoria pesquisar(Categoria cat) throws ConexaoException, DaoException {
        String sql = "SELECT * FROM Categoria where nomecategoria=?";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setString(1, cat.getNomeCategoria());
            ResultSet rs = pstm.executeQuery();
            if (rs.next()) {
                cat.setCodCategoria(rs.getInt("codcategoria"));
                cat.setNomeCategoria(rs.getString("nomecategoria"));
            }
        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
        return cat;
    }
    @Override
    public List<Categoria> pesquisarCat(Categoria cat) throws ConexaoException, ConsultaException {
        List<Categoria> lista = new ArrayList<Categoria>();
        String sql = "SELECT *FROM categoria WHERE nomecategoria like ?";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setString(1, cat.getNomeCategoria());
            ResultSet rs = pstm.executeQuery();
            while (rs.next()) {
                cat = new Categoria();
                cat.setCodCategoria(rs.getInt("codcategoria"));
                cat.setNomeCategoria(rs.getString("nomecategoria"));
                lista.add(cat);
            }
        } catch (SQLException ex) {
            throw new ConexaoException();
        } finally {
            g.disconnect();
        }
        return lista;
    }
    /**
     * Metodo para Listar categorias existentes no Banco
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    @Override
     public List<Categoria> listar() throws ConexaoException, ConsultaException {
        List<Categoria> lista = new ArrayList<Categoria>();
        Categoria cat;
        String sql = "SELECT * FROM Categoria order by nomecategoria";
        try {
            Statement stm = (Statement) g.connect().createStatement();
            ResultSet rs = stm.executeQuery(sql);
            while (rs.next()) {
                cat = new Categoria();
                cat.setCodCategoria(rs.getInt("codcategoria"));
                cat.setNomeCategoria(rs.getString("nomecategoria"));
                lista.add(cat);
            }
        } catch (SQLException ex) {
            throw new ConsultaException();
        } finally {
            g.disconnect();
        }
        return lista;
    }
 }

